package com.goldsprite.microhorigame.screens.tests.lightsystem;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Interpolation;
import com.goldsprite.gameframeworks.log.Debug;

public class DayNightLightEngine extends HackLightEngine {
	// 24小时制时间相关
	private float currentHour = 6.0f; // 默认从早上6点开始
	private float dayDurationSeconds = 60f; // 默认60秒对应游戏24小时

	// 环境光颜色定义
	private final Color DAWN_COLOR = new Color(0.8f, 0.55f, 0.4f, 1f);      // 日出
	private final Color DAY_COLOR = new Color(0.85f, 0.75f, 0.65f, 1f);       // 白天
	private final Color NOON_COLOR = new Color(1f, 0.98f, 0.9f, 1f);       // 正午
	private final Color DUSK_COLOR = new Color(0.8f, 0.5f, 0.3f, 1f);      // 日落
	private final Color NIGHT_COLOR = new Color(0.15f, 0.2f, 0.4f, 1f);   // 夜晚
	private final Color MIDNIGHT_COLOR = new Color(0.1f, 0.12f, 0.24f, 1f); // 午夜

	// 时间段配置数组 - 按时间顺序排列，添加正午和午夜
	private final TimePeriod[] timePeriods = {
		new TimePeriod("黎明前", 4.0f, 5.0f, MIDNIGHT_COLOR, DAWN_COLOR, true), // 调整
		new TimePeriod("日出", 5.0f, 7.0f, DAWN_COLOR, DAY_COLOR, true),
		new TimePeriod("白天", 7.0f, 12.0f, DAY_COLOR, NOON_COLOR, true),
		new TimePeriod("正午", 12.0f, 14.0f, NOON_COLOR, NOON_COLOR, false), // 新增正午时段
		new TimePeriod("下午", 14.0f, 17.0f, NOON_COLOR, DAY_COLOR, true), // 调整
		new TimePeriod("日落", 17.0f, 19.0f, DAY_COLOR, DUSK_COLOR, true),
		new TimePeriod("夜晚", 19.0f, 22.0f, DUSK_COLOR, NIGHT_COLOR, true),
		new TimePeriod("午夜", 22.0f, 4.0f, NIGHT_COLOR, MIDNIGHT_COLOR, true), // 新增午夜时段
	};

	public DayNightLightEngine() {
		this(0.1f, 0.1f, 0.2f, 1f);
	}

	public DayNightLightEngine(float ambientR, float ambientG, float ambientB, float ambientA) {
		super(ambientR, ambientG, ambientB, ambientA);
	}

	/**
	 * 设置一整天持续多少秒（例如setDayTime(10)表示10秒delta就是游戏24小时）
	 */
	public void setDayDuration(float seconds) {
		this.dayDurationSeconds = seconds;
	}

	/**
	 * 获取当前设置的整天持续时间（秒）
	 */
	public float getDayDuration() {
		return dayDurationSeconds;
	}

	/**
	 * 更新昼夜循环（基于24小时制，时间一直往前）
	 */
	public void updateDayNightCycle(float delta) {
		Debug.infoT("DayNight", "时间: %s, 表: %s, 亮度%: %s%", getTimeOfDay(), getCurrentTime(), getAmbientLightPercent());

		// 计算时间增量：delta秒对应多少游戏小时
		float hoursDelta = (delta / dayDurationSeconds) * 24f;

		// 更新小时（时间一直往前，不循环）
		currentHour += hoursDelta;

		updateAmbientLight();
	}

	private void updateAmbientLight() {
		Color lightColor = new Color();
		float adjustedHour = currentHour % 24; // 用于阶段判断的0-24小时

		// 遍历所有时间段，找到当前所处的时间段
		for (TimePeriod period : timePeriods) {
			if (isInTimePeriod(adjustedHour, period)) {
				if (period.isTransition) {
					// 过渡时段：根据进度使用缓入缓出混合颜色
					float progress = calculateProgress(adjustedHour, period);
					// 使用 LibGDX 的缓入缓出插值函数
					float smoothProgress = Interpolation.smoother.apply(progress);
					lightColor.set(period.startColor).lerp(period.endColor, smoothProgress);
				} else {
					// 持续时段：直接使用颜色
					lightColor.set(period.startColor);
				}
				break;
			}
		}

		setAmbientLightColor(lightColor);
	}

	/**
	 * 判断当前时间是否在指定时间段内
	 */
	private boolean isInTimePeriod(float hour, TimePeriod period) {
		if (period.startHour < period.endHour) {
			// 正常时间段（不跨天）
			return hour >= period.startHour && hour < period.endHour;
		} else {
			// 跨天时间段（如夜晚19:00-5:00）
			return hour >= period.startHour || hour < period.endHour;
		}
	}

	/**
	 * 计算在当前时间段内的进度（0.0-1.0）
	 */
	private float calculateProgress(float hour, TimePeriod period) {
		float duration;
		float currentTime;

		if (period.startHour < period.endHour) {
			// 正常时间段
			duration = period.endHour - period.startHour;
			currentTime = hour - period.startHour;
		} else {
			// 跨天时间段
			duration = (24 - period.startHour) + period.endHour;
			if (hour >= period.startHour) {
				currentTime = hour - period.startHour;
			} else {
				currentTime = (24 - period.startHour) + hour;
			}
		}

		return currentTime / duration;
	}

	/**
	 * 获取当前时间段
	 */
	private TimePeriod getCurrentTimePeriod() {
		float adjustedHour = currentHour % 24;
		for (TimePeriod period : timePeriods) {
			if (isInTimePeriod(adjustedHour, period)) {
				return period;
			}
		}
		return timePeriods[0]; // 默认返回第一个
	}

	/**
	 * 设置具体时间（小时，可以是任意值，时间一直往前）
	 */
	public void setTime(float hour) {
		this.currentHour = hour;
		updateAmbientLight();
	}

	/**
	 * 获取时间段描述
	 */
	public String getTimeOfDay() {
		return getCurrentTimePeriod().name;
	}

	/**
	 * 获取当前时间（24小时制格式）
	 */
	public String getCurrentTime() {
		float adjustedHour = currentHour % 24;
		int hours = (int) adjustedHour;
		int minutes = (int) ((adjustedHour - hours) * 60);
		return String.format("%02d:%02d", hours, minutes);
	}

	/**
	 * 获取当前小时（可以是任意值，不限制在0-24）
	 */
	public float getCurrentHour() {
		return currentHour;
	}

	/**
	 * 获取从游戏开始经过的总小时数
	 */
	public float getTotalHours() {
		return currentHour;
	}

	/**
	 * 获取当前整天持续时间的进度（0.0-1.0）
	 */
	public float getDayProgress() {
		return (currentHour % 24) / 24f;
	}

	public float getAmbientLightPercent() {
		Color c = ambientLightColor;
		// 计算颜色的亮度
		float luminance = 0.2126f * c.r + 0.7152f * c.g + 0.0722f * c.b;
		// 归一化并转换为百分比
		float percent = Math.min(luminance, 1.0f) * 100.0f;
		// 四舍五入到两位小数
		return Math.round(percent * 100.0f) / 100.0f;
	}



	// 时间段配置
	private static class TimePeriod {
		final String name;
		final float startHour;
		final float endHour;
		final Color startColor;
		final Color endColor;
		final boolean isTransition; // 是否为过渡时段

		TimePeriod(String name, float startHour, float endHour, Color startColor, Color endColor, boolean isTransition) {
			this.name = name;
			this.startHour = startHour;
			this.endHour = endHour;
			this.startColor = startColor;
			this.endColor = endColor;
			this.isTransition = isTransition;
		}
	}
}
